Fix file-relative-name to allow for ancestors as well as descendants.
authorKarl Heuer <kwzh@gnu.org>
Wed, 2 Feb 1994 04:39:22 +0000 (04:39 +0000)
committerKarl Heuer <kwzh@gnu.org>
Wed, 2 Feb 1994 04:39:22 +0000 (04:39 +0000)
lisp/files.el

index 8eb4ff490e2bd6bf78c2b2edfa9a7aa683ae6f21..f5aad139dd1360148e5665e0a2d32d444ab65cf0 100644 (file)
@@ -1382,22 +1382,16 @@ Value is a list whose car is the name for the backup file
   "Return number of names file FILENAME has."
   (car (cdr (file-attributes filename))))
 
-(defun file-relative-name-1 (directory)
-  (cond ((string= directory "/")
-        filename)
-       ((string-match (concat "^" (regexp-quote directory))
-                      filename)
-        (substring filename (match-end 0)))
-       (t
-        (file-relative-name-1
-         (file-name-directory (substring directory 0 -1))))))
-
 (defun file-relative-name (filename &optional directory)
   "Convert FILENAME to be relative to DIRECTORY (default: default-directory)."
   (setq filename (expand-file-name filename)
        directory (file-name-as-directory (expand-file-name
                                           (or directory default-directory))))
-  (file-relative-name-1 directory))
+  (let ((ancestor ""))
+    (while (not (string-match (concat "^" (regexp-quote directory)) filename))
+      (setq directory (file-name-directory (substring directory 0 -1))
+           ancestor (concat "../" ancestor)))
+    (concat ancestor (substring filename (match-end 0)))))
 \f
 (defun save-buffer (&optional args)
   "Save current buffer in visited file if modified.  Versions described below.